﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloPerfiles;
using SIGEB.Prototipo.Vista.moduloUsuarios;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Modelo.moduloGrupo;
using SIGEB.Modelo.moduloPrestamos;
using SIGEB.Modelo;
using SIGEB.Prototipo.Vista.moduloDocumentos;

namespace SIGEB.Prototipo.Vista.moduloPrestamosDevoluciones
{
    public partial class frm_PrestamoDevolucion : frm_ModuloBase
    {
        # region "Atributos"

        LinkedList<usuario> datosActuales;
        LinkedList<prestamo> prestamosActuales;
        LinkedList<reserva> reservasActuales;
        reserva reservaActual;

        # endregion

        # region "Constructores"

        public frm_PrestamoDevolucion():base()
        {
            InitializeComponent();
        }

        public frm_PrestamoDevolucion(controlPrincipal cp): base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
        }

        # endregion

        # region "Eventos"

        private void frm_PrestamoDevolucion_Load(object sender, EventArgs e)
        {

        }

        private void gpb_Prestamo_Enter(object sender, EventArgs e)
        {

        }

        private void lbl_IdUsuario_Click(object sender, EventArgs e)
        {

        }

        private void rbtn_Devolucion_CheckedChanged(object sender, EventArgs e)
        {
            gpb_Prestamo.Visible = false;
            gpb_Devolucion.Visible = true;
            dgv_VistaPrevia.Visible = false;
            lbl_Solicitudes.Visible = false;
            frm_PrestamoDevolucion.ActiveForm.Width = 663;
            frm_PrestamoDevolucion.ActiveForm.Height = 300;
            txb_CodigoDocumento2.Focus();
        }

        private void rbtn_Prestamo_CheckedChanged(object sender, EventArgs e)
        {
            gpb_Prestamo.Visible = true;
            gpb_Devolucion.Visible = false;
            dgv_VistaPrevia.Visible = true;
            frm_PrestamoDevolucion.ActiveForm.Width = 1034;
            frm_PrestamoDevolucion.ActiveForm.Height = 651;
        }

        private void gpb_Devolucion_Enter(object sender, EventArgs e)
        {

        }

        private void btn_ProcesarPrestamo_Click(object sender, EventArgs e)
        {
            validaPrestamo();
            vaciarCampos();
        }

        private void btn_BuscarUsuarios_Click(object sender, EventArgs e)
        {
            objetoReturn a = new
            objetoReturn();
            new busquedaUsuario(datosActuales, a).ShowDialog();
            string b = a.objeto;
            txb_IdUsuario.Text = b;
            cambioTxb_IdUsuario();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void llenarCamposRetorno(String id)
        {
            txb_CodigoDocumento.Text = id;
            cambioTxb_IdDocumento();
        }

        private void btn_busquedaDocumentos_Click(object sender, EventArgs e)
        {
            objetoReturn a = new objetoReturn();
            new busquedaDocumento(a, this.cp).ShowDialog();
            if (a.objeto != null)
            {
                string b = a.objeto;
                llenarCamposRetorno(b);
            }
        }

        private void btn_busquedaUsuarios_Click(object sender, EventArgs e)
        {
            cp.abrirVentana(this, controlPrincipal.VENTANA_PRESTAMOS_BUSQUEDA_USUARIOS, null);
        }

        private void txb_IdUsuario_Leave(object sender, EventArgs e)
        {

        }

        private void txb_IdUsuario_TextChanged(object sender, EventArgs e)
        {
            cambioTxb_IdUsuario();
        }

        private void txb_NumeroAdquisicion_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if (cp.ctrlPrestamo.ejemplarValido(txb_NumeroAdquisicion.Text))
                {
                    txb_CodigoDocumento.Text = cp.ctrlEjemplares.ejemplarCodigo(txb_NumeroAdquisicion.Text).idDocumento;
                    llenarCamposRetorno(txb_CodigoDocumento.Text);
                }
                else
                {
                    limpiarCamposDocumento();
                }
            }
            catch (Exception a)
            { }
            
        }

        private void limpiarCamposDocumento()
        {
            txb_CodigoDocumento.Text = "";
            txb_titulo.Text = "";
            txb_autor.Text = "";
            txb_serie.Text = "";
            txb_clasificacion.Text = "";
        }

        private void txb_NumeroAdquisicion_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
                btn_ProcesarPrestamo_Click(sender, e);
        }

        private void txb_IdUsuario_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
                txb_NumeroAdquisicion.Focus();
        }


        private void cambioTxb_IdUsuario()
        {
            try
            {
                if (cp.ctrlPrestamo.usuarioValido(txb_IdUsuario.Text))
                {
                    usuario u = cp.ctrlUsuario.obtenerUsuario(txb_IdUsuario.Text);
                    txb_MontoMulta.Text = cp.ctrlPrestamo.obtenerGrupoUsuario(txb_IdUsuario.Text).multaDiaria.ToString();
                    txb_usuario.Text = u.nombre + " " + u.apellido1 + " " + u.apellido2;
                    txb_NumeroAdquisicion.Focus();
                }
                else
                    txb_MontoMulta.Text = "";
            }
            catch (Exception e)
            { }
        }

        private void cambioTxb_IdDocumento()
        {
            try
            {
                if (cp.ctrlPrestamo.idDocumentoValido(txb_CodigoDocumento.Text))
                {
                    documento d = cp.ctrlDocumentos.documentoCodigo(txb_CodigoDocumento.Text);
                    txb_titulo.Text = d.titulo;
                    txb_autor.Text = d.autorD.nombre;
                    txb_serie.Text = d.serie;
                    txb_clasificacion.Text = d.clasificacion;
                }
                else
                    txb_MontoMulta.Text = "";
            }
            catch (Exception e)
            { }
        }

        private void btn_ProcesarDevolucion_Click(object sender, EventArgs e)
        {
            try
            {
                if (cp.usuarioActualPuede(acciones.PRESTA_DEVOLVER))
                {
                    cp.ctrlPrestamo.devolverEjemplar(txb_CodigoDocumento2.Text);
                    MessageBox.Show("Devolución Procesada");
                    vaciarCampos();
                }
            }
            catch (Exception a)
            { }
        }

        private void txb_CodigoDocumento2_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
                btn_ProcesarDevolucion_Click(sender, e);
        }

        private void dgv_VistaPrevia_SelectionChanged(object sender, EventArgs e)
        {
            reservaActual = capturaSeleccion();
            escribirReserva(reservaActual);
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {

        }

        private void txb_BuscarReserva_KeyDown(object sender, KeyEventArgs e)
        {

        }

        private void txb_BuscarReserva_TextChanged(object sender, EventArgs e)
        {
            if (txb_BuscarPrestamo.Text != "")
            {
                LinkedList<prestamo> nueva = buscarId(prestamosActuales, txb_BuscarPrestamo.Text);
                if (nueva != null)
                    cargarDatosBusquedaPrestamo(nueva);
            }
            else
                cargarDatosPrestamo();
        }

        private void btn_reservas_Click(object sender, EventArgs e)
        {
            try
            {
                objetoReturn a = new objetoReturn();
                new frm_busquedaReservas(this.cp.ctrlReservas.consultarReservas(), a, this.cp).ShowDialog();
                string b = a.objeto;
                if (b != null)
                {
                    reserva r = cp.datos.reservas.obtenerreserva(b);
                    txb_CodigoDocumento.Text = r.idDocumento;
                    txb_IdUsuario.Text = r.idUsuario;
                }
            }
            catch (Exception a)
            { }
        }

        # endregion

        # region "Metodos"

        public override void hacerVisible(object[] arg)
        {
            base.hacerVisible(arg);
            actualizarControlesPermisos();
            llenarColumnas();
            cargarDatosUsuario();
            cargarDatosReserva();
            cargarDatosPrestamo();
            quitarSeleccion();
            txb_IdUsuario.Focus();
            //actualizaControles();
        }

        public void vaciarCampos()
        {
            txb_IdUsuario.Text = "";
            dtp_FechaDevolucion.Value = DateTime.Today;
            txb_MontoMulta.Text = "";
            txb_NumeroAdquisicion.Text = "";
            txb_CodigoDocumento.Text = "";
            txb_CodigoDocumento2.Text = "";
            txb_BuscarPrestamo.Text = "";
        }

        private void quitarSeleccion()
        {
            if (dgv_VistaPrevia.RowCount != 0)
            {
                dgv_VistaPrevia.Rows[0].Selected = false;
            }
        }

        private reserva capturaSeleccion()
        {
            reserva nuevo = null;
            try
            {
                dgv_VistaPrevia.Rows[dgv_VistaPrevia.SelectedCells[0].RowIndex].Selected = true;
                String codigo = dgv_VistaPrevia.SelectedRows[0].Cells[0].Value.ToString();
                if (codigo != null)
                {
                    nuevo = getReserva(codigo);
                }
            }
            catch
            {

            }
            return nuevo;
        }

        private reserva getReserva(string codigo)
        {
            foreach (reserva actual in reservasActuales)
            {
                if (actual.idReserva == codigo)
                {
                    return actual;
                }
            }
            return null;
        }

        private LinkedList<prestamo> buscarId(LinkedList<prestamo> lista, string id)
        {
            LinkedList<prestamo> nueva = new LinkedList<prestamo>();
            if (lista != null && !String.IsNullOrEmpty(id))
            {
                foreach (prestamo act in lista)
                {
                    if (act.usuarioP == id)
                    {
                        nueva.AddLast(act);
                    }
                }
            }
            return nueva;
        }

        public override void actualizar(object referencia, bibliotecaObservador.EventoActualizacion e)
        {
            int numConjunto = (int)referencia;
            if (numConjunto == conjuntoBase.CONJPRESTAMOS)
            {
                cargarDatosPrestamo();
            }
            else if (numConjunto == conjuntoBase.CONJDOCUMENTOS)
            {
                //cargarDatosGrupo();
            }
            else if (numConjunto == conjuntoBase.CONJRESERVAS)
            {
                cargarDatosReserva();
            }
            else if (numConjunto == conjuntoBase.CONJUSUARIOS)
            {
                cargarDatosUsuario();
            }
        }
        
        private void cargarDatosPrestamo()
        {
            try
            {
                if (cp.usuarioActualPuede(acciones.PRESTA_CONSULTA_TOD) )
                {
                    prestamosActuales = cp.ctrlPrestamo.prestamoTodosPendientes();
                }
                else if (cp.usuarioActualPuede(acciones.PRESTA_CONSULTA_ACT))
                {
                    prestamosActuales = cp.ctrlPrestamo.prestamoUsuario(cp.UsuarioActual);
                }

                llenarColumnas();
                if (prestamosActuales != null)
                {
                    foreach (prestamo actual in prestamosActuales)
                    {
                        dgv_VistaPrevia.Rows.Add(actual.codPrestamo, actual.fechaPrestamo, actual.fechaDevolucion, actual.usuarioP, actual.ejemplarP, actual.multaDiaria);
                    }
                }
            }
            catch (Exception e)
            { }
        }

        private void actualizarControlesPermisos()
        {
            if (!cp.usuarioActualPuede(acciones.PRESTA_REGISTRAR))
            {
                txb_autor.Enabled = false;
                txb_titulo.Enabled = false;
                txb_clasificacion.Enabled = false;
                txb_serie.Enabled = false;
                txb_CodigoDocumento.Enabled = false;
                txb_IdUsuario.Enabled = false;
                txb_MontoMulta.Enabled = false;
                txb_NumeroAdquisicion.Enabled = false;
                dtp_FechaDevolucion.Enabled = false;
                btn_BuscarUsuarios.Enabled = false;
                btn_busquedaDocumentos.Enabled = false;
                btn_ProcesarPrestamo.Enabled = false;
            }
            if (!cp.usuarioActualPuede(acciones.PRESTA_DEVOLVER))
            {
                txb_CodigoDocumento2.Enabled = false;
                rbtn_Devolucion.Enabled = false;
                btn_ProcesarDevolucion.Enabled = false;
            }
            if (!cp.usuarioActualPuede(acciones.PRESTA_CONSULTA_TOD) && !cp.usuarioActualPuede(acciones.PRESTA_CONSULTA_ACT))
            {
                dgv_VistaPrevia.Enabled = false;
            }
        }
        

        private void cargarDatosReserva()
        {
            try
            {
                reservasActuales = cp.ctrlReservas.consultarReservas();
            }
            catch (Exception e)
            { }
            /*llenarColumnas();
            if (reservasActuales != null)
            {
                foreach (reserva actual in reservasActuales)
                {
                    dgv_VistaPrevia.Rows.Add(actual.idReserva, actual.idUsuario, actual.solicitud, actual.vencimiento, actual.idDocumento);
                }
            }
             */
        }

        private void cargarDatosBusquedaReserva(LinkedList<reserva> nueva)
        {
            llenarColumnas();
            if (nueva != null)
            {
                foreach (reserva actual in nueva)
                {
                    dgv_VistaPrevia.Rows.Add(actual.idReserva, actual.idUsuario, actual.solicitud, actual.vencimiento, actual.idDocumento);
                }
            }
        }

        private void cargarDatosBusquedaPrestamo(LinkedList<prestamo> nueva)
        {
            llenarColumnas();
            if (nueva != null)
            {
                foreach (prestamo actual in nueva)
                {
                    dgv_VistaPrevia.Rows.Add(actual.codPrestamo, actual.fechaPrestamo, actual.fechaDevolucion, actual.multaDiaria, actual.usuarioP, actual.ejemplarP);
                }
            }
        }

        private void llenarColumnas()
        {
            dgv_VistaPrevia.Columns.Clear();
            dgv_VistaPrevia.Columns.Add("ID", "ID");
            dgv_VistaPrevia.Columns.Add("Fecha Préstamo", "Fecha Préstamo");
            dgv_VistaPrevia.Columns.Add("Fecha Devolución", "Fecha Devolución");
            dgv_VistaPrevia.Columns.Add("Usuario", "Usuario");
            dgv_VistaPrevia.Columns.Add("Documento", "Documento");
            dgv_VistaPrevia.Columns.Add("Monto multa", "Monto Multa");
        }

        private void agregarNuevo()
        {
            if (cp.usuarioActualPuede(acciones.PRESTA_REGISTRAR))
            {
                try
                {
                    cp.ctrlPrestamo.crearPrestamo(txb_IdUsuario.Text, txb_NumeroAdquisicion.Text, dtp_FechaDevolucion.Value, txb_MontoMulta.Text, txb_CodigoDocumento.Text);
                    cp.abrirVentana(this, controlPrincipal.VENTANA_VISTA_PREVIA_PD, null);
                    mostrarInfo("Agregado correctamente");
                }
                catch (Exception e)
                {
                    mostrarInfo(e.Message + "\nNo se ha podido agregar el nuevo prestamo");
                }

            }
        }

        private void validaPrestamo()
        {
            if (cp.usuarioActualPuede(acciones.PRESTA_REGISTRAR))
            {
                try
                {
                    cp.ctrlPrestamo.validarPrestamo(txb_IdUsuario.Text, txb_NumeroAdquisicion.Text, dtp_FechaDevolucion.Value, txb_MontoMulta.Text, txb_CodigoDocumento.Text);
                    cp.ctrlPrestamo.validaExistenciaPrestamo(txb_NumeroAdquisicion.Text);
                    cp.abrirVentana(this, controlPrincipal.VENTANA_VISTA_PREVIA_PD, enviarCampos());
                }
                catch (Exception e)
                {
                    mostrarInfo(e.Message + "\nNo se ha podido agregar el nuevo prestamo");
                }
            }
            else
            { 
                
            }
        }

        private void cargarDatosUsuario()
        {
            try
            {
                datosActuales = cp.ctrlPrestamo.todosUsuarios();
            }
            catch (Exception e)
            { }
        }

        private void escribirReserva(reserva tipo)
        {
            if (tipo != null)
            {
                txb_IdUsuario.Text = tipo.idUsuario;
                txb_CodigoDocumento.Text = tipo.idDocumento;
            }
            else
            {
                txb_IdUsuario.Text = "";
                txb_CodigoDocumento.Text = "";
            }
        }

        private string[] enviarCampos()
        {
            try
            {
                DateTime fechaPrestamo = DateTime.Today;
                documento docActual = cp.ctrlDocumentos.documentoCodigo(txb_CodigoDocumento.Text);
                usuario usuarioActual = cp.ctrlUsuario.obtenerUsuario(txb_IdUsuario.Text);
                grupo grupoActual = cp.ctrlGrupos.getGrupo(usuarioActual.idGrupo);
                tipoUsuario tipoUsuarioActual = cp.ctrlTipoUsuario.obtenerTipoUsuario(grupoActual.tipoUsuarioCodigo);
                string[] campos = { txb_NumeroAdquisicion.Text, fechaPrestamo.ToShortDateString(), dtp_FechaDevolucion.Value.ToShortDateString(), txb_MontoMulta.Text, txb_CodigoDocumento.Text, txb_IdUsuario.Text, docActual.clasificacion, docActual.titulo, usuarioActual.nombre + " " + usuarioActual.apellido1 + " " + usuarioActual.apellido2, tipoUsuarioActual.nombre, docActual.autorD.nombre };
                return campos;
            }
            catch (Exception e)
            {
                return null;
            }
            
        }

        # endregion

    }
}
